package com.shujia.io.eight;

import org.junit.Test;

import java.io.*;

public class ObjetStreamDemo3 {


    @Test
    public void test2() {
        // 反序列化，从磁盘或网络读取对象到内存
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("file\\person"))) {
            Object obj = ois.readObject();
            Person person = (Person) obj;
            System.out.println(person);

            System.out.println(person.height);
//            System.out.println(person.getHeight());

            /*
            2种情况: 新加的属性是否是必须的
            1, 如果不是必须的, 版本好保持一致, 反序列化不会报错, 业务可以正常执行
            2, 在Person里面添加新的属性, 这个属性是必须的, 缺少的话业务跑不通
            此时如果反序列化的对象缺少这个属性, 应该报错
            需要把这些报错的序列化文件从新生成
             */

            System.out.println(person.dog.name);


        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Test
    public void test1() {
        // 序列化，把对象写入到磁盘或网络
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("file\\person"))) {
            Person person = new Person();
            person.setName("张三");
            person.setAge(23);
            person.height = 180;

            Dog dog = new Dog();
            dog.name = "大黄";
            person.dog = dog;

            // person = new Person();
            person.setName("lisi");
            person.setAge(26);

            // 对同一个对象序列化多次, 只有第一次会生成二进制文件
            // 如果对象的属性值要做改变, 应该在 writeObject之前改变

            oos.writeObject(person);

            // oos.writeObject(person);

            oos.flush();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
